Google



MENU
--[News>
--[ >
--[Jak zrobić>
--[ >

--[Linki>
--[>




LICZNIK



LINKI












Wyzwalacze cz. 2
Napisał:TTBoS 18:05 20-03-06
Wyzwalacze cz. 2


W tej częsci tutoriala z serii "World Editor od A do W jak wyzwalacz" :) znajdziecie opisy kolejnych przydatnych wyzwalaczy, ich zastosowanie etc. W poprzedniej części nauczyliście się jak obsługiwać zadania, a także jak stworzyć cinematic połączony z zadaniem. Po opanowaniu wspomnianych rzeczy bez problemu tworzysz już zapewne niezłe mapki. (btw. jak coś zrobicie to wyślijcie mi meilem - chętnie zagram). Często jednak mapka wymaga od nas zastosowania wyzwalaczy, których używa się bardzo rzadko.... Rozdział obejmuje następujące zagadnienia: - przenoszenie bohatera między mapami. - zablokowanie i wznawiania wytwarzania jednostki do 1 (Dla RoC) i wiecej (dla FT ), - zablokowanie i wznawianie wytwarzania jednostki do liczby dowolnej (Dla RoC), - blokowanie zdobywania doświadczenia przez bohatera, - swietny skrypt otwierajacy/zamykajacy brame, - stworzenie okienka odliczającego czas, - stworzenie licznika np. killsów, - stworzenie (typowego dla RPG) wyboru bohaterów, - "przyczepienie" kamery do bohatera. A więc z apraszam do lektury :D Zacznijmy więc od esencji potrzebnej do stworzenia kampani - czyli przeniesienie bohatera do nastepnych misji. Byla juz o tym mowa na foroom, ale i tak czesto otrzymywalem pytania o to zagadnienie. Dlatego opisuje ten problem w tutorialu (bądź co bądź, więcej ludzi czytuje moje tutoriale niż zagląda do działu World Editor na forum) A wiec: Oto w jaki sposób przenosimy jednostke do nastepnej misji: Najpierw w wyzwalaczu Map initialization umiesz akcje [Game - Set Next Level] aby określić jaka mapka jest nastepna. Teraz w wyzwalaczu konczacym dana misje przed akcja [Game - Victory] umieszczasz 3 akcje: [Game cache - Create Game Cache] o postaci "Create a game cache from nazwa.w3v", nastepnie [Game Cache - Store Unit] w postaci "Store as of in (Last created game cache)" i ostatni: [Game Cache - Save Game Cache] w postaci "Save (Last Created Game Cache)". W nastepnej misji, aby przywrócic bohatera stosujesz dwa kolejne triggersy (umieszczasz je w map initialization) a są to: Tak ja poprzedn io [Game cache - Create Game Cache] o postaci "Create a game cache from nazwa.w3v oraz [Game Cache - Restore Unit Facing Angle] w postaci "Restore of from (Last Created Game Cache) for at (Center of ) facing " !!!Pamietaj, ze wszystkie nazwy wlasne musza miec zawsze identyczna postac w obu mapach!!! I to wszystko. W ten sposób Twój bohater zostaje przeniesiony do następnej mapy, zaraz przy jej ładowaniu. Często musimy zablokować zdobywanie doświadczenia dla bohatera. Istnieje kilka sposobów na osiągnięcie tego. Najprostszym, a zarazem skutecznym sposobem jest zastosowanie zmiennej okreslajacej poziom (stwórz zmienną typu integer np. hero_level i ustaw jego wartość początkową zgodnie z poziomem, na którym jest twój bohater na początku poziomu - standardowo 1) i nastepujacego triggersa: Events: - [Unit - Specific Unit Event] - "(bohater) Gains a level" Conditions: brak :) Actions: - [Set Variable] w postaci: "Set hero_level = (hero level + 1)" - [If/Then/Else] - "If (hero_level Equal to then do (Hero - Disable experience gain for (Leveling hero)) else do (Do nothing))" W ten oto prosty sposób zablokujesz zdobywanie doświadczenia po osiągnięciu konkretnego poziomu. Możesz też odnieść ten trigger do typu bohatera, wtedy wygląda on tak" Events: - [Generic unit event] - "a unit gains a level" Conditions: - [Unit-type comparision] - "(Unit type of (Leveling hero)) Equal to " Actions: - takie jak powyżej :D Inną rzeczą jest zablokowanie wytwarzania jednostki, gdy ta została już wytworzona :) W FT(!!!mimo wszystko, nawet jeśli masz RoC zobacz czy jest u ciebie poniższa akcja, w odpowiednio spatchwanej wersji Roc chyba :) jest ona już dostępna!!!) sprawa jest baaardzo prosta - w triggersie inicjalizującym mapę umieszczamy akcję [Player - Limit Training Of Unit Type] i ograniczamy wytwarzanie danej jednostki do okreslonej liczby. Dla RoC sprawa wymaga zastosowania następującego wyzwalacza -> (dotyczy RoC) Events: - Unit - A unit ownet by (Player) Finishes Training a unit Conditions: - (Unit Type of (Trained Unit)) Equal to (wybrana jednostka) Actions: - Player - Make (wybrana jedostka) Unavailable for training/construction by (player) Jeżeli po śmierci danej jednostki, ma ona znów pojawić się możliwa do wytworzenia stosujemy takie coś: Events: - Unit - A unit ownet by (Player) Dies Conditions: - (Unit Type of (Dying Unit)) Equal to (wybrana jednostka) Actions: - Player - Make (wybrana jedostka) Available for training/construction by (player). W ten prosty sposób możemy ograniczyć wytwarzanie danej jednostki/wybudowanie danego budynku do 1. !!!Dla RoC only!!! A jak zrobic zeby mozna bylo ustawic np do 5? Sprawa wymaga zastosowania zmiennej typu integer oraz 3 wyzwalaczy - jeden zwiekszajacy zmienną, gdy zostanie wytworzona dana jednostka, drugi - gdy dana jednostka zginie(zmniejszacy zmienną) i trzeci - blokujacy wytwarzanie danych jednostek. W tym systemie znalazlem jednak "dziure". Otóż, nim wytworzy sie ostatnia z liczby jednostek które maja byc dostepne (np piąta z 5. które można wytworzyc), gracz moze "zakolejkowac" do wytw orzenia wieksza ilosc danych jednostek. Ale poradzielm sobie z tym w pewien... dziwny, ale skuteczny sposób. Zademonstruje to na przykładzie footmana dla playera 1(red). Na pocątku tworzymy zmienną typu integer - ja nazwałem ją liczba_footmanuf :). Pierwszy wyzwalacz - ten zwiekszajacy zmienną ma postac: Events: - [Unit - Player-Owned Unit Event] w postaci: "Unit - A unit owned by Player 1 (Red) Finishes training a unit " Conditions: - [Unit-Type Comparision] w postaci "(Unit type of (Trained unit)) Equal to Footman" Actions: - [Set variable] - "Set liczba_footmanuf = (liczba_footmanuf +1)" - [If/Then/Else] - " If (liczba_footmanuf Greater than 5) then do (Unit - Explode(trained unit) else (do nothing) Wlasnie ta ostatnia akcja ogranicza wytworzenie footmanów poza żądaną liczbę. Jeżeli gracz ma już odpowiednią liczbę rycerzy - następna wytworzona - zginie śmiercią tragiczną :D. Kolejny wyzwalacz okresla co sie stanie, gdy którys z footmanów zginie: Events - [Unit - Player-Owned Unit Event] w postaci: "Unit - A unit owned by Player 1 (Red) Dies" Conditions: - [Unit-Type Comparision] w postaci "(Unit type of (Dying unit)) Equal to Footman" Actions: - [Set variable] - "Set liczba_footmanuf = (liczba_footmanuf -1)" - [If/Then/Else] - " If (liczba_footmanuf Less than 5) then do (Player - Make footman Available for training/construction by player 1 (Red)) else (do nothing). Ostatnia akcja uzupełnia ostatnią akcję z poprzedniego wyzwalacza. Gdy zostaje wytworzony "ponadliczbowy" footman, technologia nie zostaje wznowiona, dopiero gdy liczba rycerzy spadnie ponizej 5 technologia znów stanie się dostępna. Ostatni wyzwalacz do tego zagadnienia to blokujący wytwarzanie, a wygląda on tak: Events: - [Unit - Player-Owned Unit Event] w postaci: "Unit - A unit owned by Player 1 (Red) Finishes training a unit " Conditions: - [Unit-Type Comparision] w postaci "(Unit type of (Trained unit)) Equal to Footman" - [Integer Comparision] - "liczba_footmanuf Greater or equal to 5" Actions: - [Player - Set training/construction Availabilit y Of Unit] - "(Player - Make footman Unavailable for training/construction by player 1 (Red))" Te trzy triggersy tworzą kompletną całość. Mozesz je zastosowac jako gotowce - ustawiając tylko jednostkę, gracza i liczbe ograniczającą. Ponizsze triggersy obrazują prosty, a zarazem niezwykle skuteczny skrypt otwierający/zamykający bramę. Jest on o tyle zaawansowany, że brama nie zamknie się dopuki !wszystkie! jednostki nie opuszczą regionu aktywującego. Niedoróbka w "zwykłym" otwierającym bramę triggersie polega na tym, że wchodząc na region aktywujący grupą jednostek brama otwiera się, ale gdy pierwsza jednostka z grupy opuści region, brama zamknie się - nie ważne czy wszystkie jednostki przeszły już przez nią czy nie. I trzeba ją otwierać ponownie. Natomiast skrypt opisany ponizej radzi sobie z tym doskonale :D Sprawa (jak zwykle) wymaga zastosowania zmiennej. Stwórz więc zmienną typu integer o nazwie np. units_by_gate(tą nazwą operuję poniżej), oraz region atywujący czyli po wejściu na który brama będzie się o twierać i po wyjściu z którego brama będzie się zamykać.. Całość składa się z 3 wyzwalaczy. Pierwszy z nich - uruchamiany gdy jednostka wchodzi na region aktywujący wygląda tak: Events: - Unit - a unit enters Conditions: - [Player Comparision] - "(Owner of (Triggering Unit)) Equal to " Actions: - [Destructible - Open/Close/Destroy Gate] - "Open " - [Set variable] - "Set (units_by_gate) = (units_by_gate + 1)" Drugi wyzwalacz aktywowany przez wyjście jednostki z regionu: Events: - [Unit - A Unit Leaves Region] - "Unit leaves " Conditions: - [Player Comparision] - "(Owner of (Triggering Unit)) Equal to " Actions: - [Set variable] - "Set (units_by_gate) = (units_by_gate - 1)" Trzeci trigger sprawdza, czy w regionie aktywującym są jakieś jednostki - jeżeli nie ma - zamyka brame: Events: - [Time - Periodic Event] - "Every 0,10 seconds of game time" Conditions: - [Integer comparision] - "units_by_gate Equal to 0" Actions: - [Destructible - Open/Close/Destroy Gate] - "Close " Czasem przydaje się licznik, odliczający czas. Stworzenie takiego czegos nie jest trudne. Najpierw stwórz zmienną typu Timer o nazwie np. Timer. Jego wartość początkową zostaw na New Timer(Default). Całość aktywujemy następującym wyzwalaczem: Events: - Map initialization Conditions: - brak Actions: - [Countdown Timer - Start Timer] w postaci "Start as a One-shot(jednorazowy)/repeating(powtarzający się) timer that will expire in seconds. " W efekcie w prawym górnym rogu pojawi się okienko w którym będzie odmierzany czas. Przy pomocy różnych akcji zaczynających się od [Countdown timer - ...] mozna zmienieac wygląd, kolory itp okienka. Teraz zajmiemy się stworzeniem licznika, w którym będzie wyświetlana ilość killsów danego gracza. A także który uporządkuje graczy od tego który zabił najwięcej do tego który zabił najmniej :D. Po pierwsze stwórz dla każdego gracza zmienną typu integer (określającą ilość zabitych) o nazwie np. player1_kills itp. Teraz stwórzmy wyzwalacz o następującej postaci: Events: - Map initialization Conditions: - brak Actions: - [L eaderboard - create] - "Create a leaderboard for (all players) titled - [Set variable] - "Set = (Last Created Leaderboard) - [Leaderboard - Show/Hide] - "Show " - [Leaderboard - Add Player] - "Add Player 1 (Red) with label (Name of Player 1 (Red) and value Player1_kills (((uzyj tej akcji po kolei dla kazdego gracza) Nastepnie dla kazdego gracza tworzysz nastepujący trigger: Events: - [Unit - Generic Unit Event] - w postaci "Unit Dies" Conditions: - [Boolean Comparision] - "((Dying unit ) is A structure) not equal to true" (ten warunek , sprawi ze zniszczone budynki nie będą się liczyc jako zabity) - [Player Comparision] - "(Owner of (Killing Unit)) Equal to )" Actions: - [Set variable] - Set = (zmienna_dla_danego_gracza + 1) - [Leaderboard - Sort] - "Sort by Value in Descending(od najwiekszego do najmniejszego) order" Po stworzeniu dla każdego gracza takiego triggera, podczas testu widzisz w prawym górnym rogu okienko i w nim pierwsze miejsce zajmuje ten, kto zabił najwięcej unitów itp. Tu również mozna zmien iać wygląd okienka, tym razem przy pomocy akcji zaczynających się od [Leaderboard - ...]. Zauważyliście zapewne, że w większości warcraftowych RPGówek na początku można sobie wybrać bohatera. Teraz zajmijmy się stworzeniem takiego "czegoś". Najpierw, gdzieś w miejscu niedostępnym podczas gry (górka albo coś) Najlepiej mimo wszystko otoczyć obszar wyboru bohaterów pathing blocker'ami, żeby nikt się tu nie dostał. Stawiamy w równej odległości od siebie Circle of power dla każdego bohatera(ustawiamy na nich bohaterów). Pod nimi tworzymy regiony - odpowiednio je nazywamy - np. region pod blademasterem bedzie mial nazwe blademaster_choose. Stawiamy dla każdego gracza po jednej jednostce wybierającej - najlepiej nadaje się do tego Shade, gdyż nie ma żadnego ataku itp. Jeśli chcesz zastosować peasanta, albo wispa - pamietaj aby wylaczyc mu atak i specjalne umiejetnosci (budowanie, autodestrukcja (dla wispa)). Teraz tworzymy dla każdego bohatera wyzwalacz o takiej postaci: (na przykladzie blademastera) Events: - Unit - Unit Enters Conditions: - Unit Type of (Triggering Unit) Equal to Actions: - [Unit - Create Units Facing Angle] - " Create 1 for (Owner of (triggering Unit)) at Center of facing Default building facing degrees" - [Set Variable] - "Set = Last created Unit" (później chcąc odwołać się do wybranego bohatera, stosujemy właśnie ta zmienną np. gdy chcemy mu dać jakiś przedmiot, doświadczenie, umiejętność) - [Unit - Kill] - "Kill (triggering unit)" (zabija jednostkę wybierającą, żeby nie mogła wybierać więcej bohaterów) - [Camera - Pan Camera (Timed) ] - "Pan camera for Owner of ((triggering unit)) to (center of) over seconds" Nie zapomnij ze musisz stworzyc taki wyzwalacz dla kazdego z bohaterów dostępnych do wyboru (proponuje użyc metody kopiuj/wklej i zmieniac tylko odpowiednie wartosci (oczywiscie wiecie co to są odpowiednie wartości :D). Teraz możez już tworzyć RPG z wyborem bohatera :) Ostatnią rzeczą, jaką zajmiemy się w tym rozdziale jest zablokowanie widoku kamer do bohatera. Jest to bardzo proste. W tym c elu stosujemy akcję: - [Camera - Lock Camera Target to Unit] - "Lock camera target for to , offset by (0.00,0.00)(przesuniecie kamery) using The Unit's rotation" Akcję tą umieszczamy w odpowiednim wyzwalaczu. Jeżeli bohater, do którego kamera ma się przyczepić, istnieje już podczas inicjowania mapy, to umieszczamy ją w "Meele initialization". Jezeli natomiast stosujemy wspomniany wcześniej wybór bohatera, to umieszczamy ją ja końcu wyzwalacza opisanego w poprzednim dziale, a jako uzywamy zmiennej. I wszystko jasne :P Jeżeli popracowaliście już trochę z edytorem, to zapewne zauważyliście, że możliwosci związane z edytorem wyzwalaczy są nieograniczone, Opisanie wszystkiego, co z nimi związane nie ma najmniejszego sensu. Dlatego nie będę pisał więcej tutoriali taktujących o wyzwalaczach. Jednak nie załamujcie się :D. Jeżeli tylko czegoś nie wiecie, skontaktujcie się ze mną (na forum, w dziale "Edytor Map", mejlem (norix2@wp.pl), albo na gg - 1477668). Pytając o coś będziecie współtworzyć FAQ, które powstanie na bazie właśnie waszych pytań. Wniosek: nie ma pytań - nie ma FAQ. A więc zachęcam do zadawania tychże :) I jeszcze raz pozwolę sobie przypomnieć: TESTUJCIE, PRÓBUJCIE, KOMBINUJCIE!!! - oto najlepszy przepis na to, żeby zostać adeptem, a nawet mistrzem :D mapcrafta.

nastepna strona >>

Strona: 1/1







LINKI
STRONE NAJLEPIEJ SIE OGLĄDA W ROZDZIELCZOŚCI 1024x768 I W PRZEGLĄDARCE MOZILLA FIREFOX KTÓRĄ MOŻNA POBRAĆ Z BOWYSZEGO LINKU.

©2006-2007 TTBoS. All rights reserved.